package com.newshub.ai.core.client;

import com.newshub.ai.model.dto.ChatRequest;
import com.newshub.ai.model.dto.ChatResponse;


import java.util.List;

/**
 * LLM客户端接口
 * 定义通用的LLM交互方法
 */
public interface LLMClient {

    /**
     * 发送聊天消息
     *
     * @param request 聊天请求
     * @return 聊天响应
     */
    ChatResponse chat(ChatRequest request);

    /**
     * 检查客户端是否可用
     *
     * @return 是否可用
     */
    boolean isAvailable();

    /**
     * 获取客户端类型
     *
     * @return 客户端类型
     */
    String getClientType();

    /**
     * 获取模型信息
     *
     * @return 模型信息
     */
    String getModelInfo();

    /**
     * 带上下文的聊天
     * 
     * 注意：这是 default 方法，提供默认实现。
     * 实现类可以选择覆盖此方法提供更优的上下文处理，
     * 或者使用此默认实现（简单调用普通聊天）。
     *
     * @param request 聊天请求
     * @param context 上下文消息列表
     * @return 聊天响应
     */
    default ChatResponse chatWithContext(ChatRequest request, List<ChatRequest.ChatMessage> context) {
        return chat(request);
    }

    /**
     * 流式聊天
     * 
     * 注意：这是 default 方法，提供兜底实现。
     * 实现类应该覆盖此方法提供真正的流式响应（如调用AI API的stream=true），
     * 如果未覆盖，则使用此默认实现模拟流式效果（将完整回复分片发送）。
     *
     * @param request 聊天请求
     * @param onDelta 增量内容回调
     */
    default void chatStream(ChatRequest request, java.util.function.Consumer<String> onDelta) {
        // 兜底实现：调用普通聊天并模拟流式
        ChatResponse response = chat(request);
        if (response.getSuccess() && response.getContent() != null) {
            String content = response.getContent();
            // 模拟流式：每50个字符发送一次
            int chunkSize = 50;
            for (int i = 0; i < content.length(); i += chunkSize) {
                int end = Math.min(i + chunkSize, content.length());
                String chunk = content.substring(i, end);
                onDelta.accept(chunk);
                try {
                    Thread.sleep(60); // 60ms延迟模拟流式效果
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    break;
                }
            }
        }
    }
}

